package xyz.zhno.template.common.core.util;

import xyz.zhno.template.common.core.enums.ErrorCodeEnum;
import xyz.zhno.template.common.core.exception.APIException;

/**
 * 校验器
 * @author zh_o
 */
public class Validator {

    /**
     * 校验表达式是否为真，不为真则抛出异常
     * @param expression 校验的表达式
     */
    public static void valid(boolean expression) {
        if (!expression) {
            throw new APIException(ErrorCodeEnum.SERVER_ERROR);
        }
    }

    /**
     * 校验表达式是否为真，不为真则抛出异常
     * @param expression 校验的表达式
     * @param message 抛出异常的message
     */
    public static void valid(boolean expression, String message) {
        if (!expression) {
            throw new APIException(message);
        }
    }

    /**
     * 校验表达式是否为真，不为真则抛出异常
     * @param expression 校验的表达式
     * @param code 抛出异常的错误码
     * @param message 抛出异常的message
     */
    public static void valid(boolean expression, String code, String message) {
        if (!expression) {
            throw new APIException(code, message);
        }
    }

    /**
     * 校验表达式是否为真，不为真则抛出异常
     * @param expression 校验的表达式
     * @param errorCode 错误码枚举
     */
    public static void valid(boolean expression, ErrorCodeEnum errorCode) {
        if (!expression) {
            throw new APIException(errorCode);
        }
    }

    /**
     * 是否不为空，为空则抛出异常
     * @param obj 校验的对象
     */
    public static <T> T notNull(T obj) {
        if (BeanUtils.isEmpty(obj)) {
            throw new APIException(ErrorCodeEnum.SERVER_ERROR);
        }
        return obj;
    }

    /**
     * 是否不为空，为空则抛出异常
     * @param obj 校验的对象
     * @param message 抛出异常的message
     */
    public static <T> T notNull(T obj, String message) {
        if (BeanUtils.isEmpty(obj)) {
            throw new APIException(message);
        }
        return obj;
    }

    /**
     * 是否不为空，为空则抛出异常
     * @param obj 校验的对象
     * @param code 抛出异常的错误码
     * @param message 抛出异常的message
     */
    public static <T> T notNull(T obj, String code, String message) {
        if (BeanUtils.isEmpty(obj)) {
            throw new APIException(code, message);
        }
        return obj;
    }

    /**
     * 是否不为空，为空则抛出异常
     * @param obj 校验的对象
     * @param errorCode 错误码枚举
     */
    public static <T> T notNull(T obj, ErrorCodeEnum errorCode) {
        if (BeanUtils.isEmpty(obj)) {
            throw new APIException(errorCode);
        }
        return obj;
    }

    /**
     * 是否不为空字符串，为空则抛出异常
     * @param str 校验的字符串
     */
    public static String notBlank(String str) {
        if (BeanUtils.isEmpty(str) || StringUtils.isBlank(str)) {
            throw new APIException(ErrorCodeEnum.SERVER_ERROR);
        }
        return str;
    }

    /**
     * 是否不为空字符串，为空则抛出异常
     * @param str 校验的字符串
     * @param message 抛出异常的message
     */
    public static String notBlank(String str, String message) {
        if (BeanUtils.isEmpty(str) || StringUtils.isBlank(str)) {
            throw new APIException(message);
        }
        return str;
    }

    /**
     * 是否不为空字符串，为空则抛出异常
     * @param str 校验的字符串
     * @param code 抛出异常的错误码
     * @param message 抛出异常的message
     */
    public static String notBlank(String str, String code, String message) {
        if (BeanUtils.isEmpty(str) ||StringUtils.isBlank(str)) {
            throw new APIException(code, message);
        }
        return str;
    }

    /**
     * 是否不为空字符串，为空则抛出异常
     * @param str 校验的字符串
     * @param errorCode 错误码枚举
     */
    public static String notBlank(String str, ErrorCodeEnum errorCode) {
        if (BeanUtils.isEmpty(str) || StringUtils.isBlank(str)) {
            throw new APIException(errorCode);
        }
        return str;
    }

}
